package com.twq.func.innerctrl

/**
 * Created by tangweiqun on 2017/11/28.
 */
object IfAndWhile {
  def main(args: Array[String]): Unit = {
    //1、使用if
    var filename = "default.txt"
    if (!args.isEmpty)
      filename = args(0)

    //2、上面的程序可以写的更好点，如下：
    //var 被 val替代，因为if语句中可以计算出值，使得程序更加函数式一点
    val filenameNice = if (!args.isEmpty) args(0) else "default.txt"

    //3、所以我们可以这样写：
    println(if (!args.isEmpty) args(0) else "default.txt")

    //4、while loop
    def gcdLoop(x: Long, y: Long): Long = {
      var a = x
      var b = y
      while (a != 0) {
        val temp = a
        a = b % a
        b = temp
      }
      b
    }

    //5、do ... while loop
    Unit
    var line = ""
    do {
      line = scala.io.StdIn.readLine()
      println("Read: " + line)
    } while (line != "")


    //6、不管是while还是do...while，我们都不能叫做表达式，而应该叫做循环，因为它们不会计算出一个新值
    //它们的值类型是Unit，在scala中Unit和()是相等的
    def greet() = {
      println("hi")
    }

    () == greet() //将返回true

    //7、在scala中给var重新赋值，永远都是返回()(即Unit)
    //然后() != ""将永远返回true
    var tempLine = ""
    while ((tempLine = scala.io.StdIn.readLine()) != "") // This doesn't work!
      println("Read: " + tempLine)

    //8、因为while循环不计算出值，所以while的代码不那么的函数式，一般都会含有var变量，
    // scala选择保留while是因为有些场景使用while的代码的可读性还是很强的
    // 采用递归来消除掉var
    def gcd(x: Long, y: Long): Long =
      if (y == 0) x else gcd(y, x % y)

  }
}
